package Tools;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.*;
/**
 *
 * @author couillu
 */
public class JDOMManager {

    //nom du fichier
    private String nomFichier;
    
    //extension du fichier de sauvegarde
    private final String EXTENSION = ".xml"; 

    //Nous allons commencer notre arborescence en créant la racine XML
    //qui sera ici "Robots".
    private Element racine;

    //On crée un nouveau Document JDOM basé sur la racine que l'on vient de créer
    private org.jdom.Document document ;
   
    public JDOMManager(String nomFichierWithoutExtension) {
        this.nomFichier =   nomFichierWithoutExtension+this.EXTENSION;
        
        if (!this.readFile())
        {
            //on initialise les éléments
            System.out.println("Initialisation des éléments.");
            this.racine     = new Element("Robots");
            this.document   = new Document(racine);
        }            
    }
    
    //renvoie une liste de robots sous la forme: nom|speed|levelAccess
    public ArrayList<String> getListRobot()
    {
        //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
       List listRobots = racine.getChildren("robot");
       
       ArrayList<String>  listRobotsFinal = new ArrayList<>();
       //On crée un Iterator sur notre liste
       Iterator i = listRobots.iterator();
       while(i.hasNext())
       {
          //On recrée l'Element courant à chaque tour de boucle afin de
          //pouvoir utiliser les méthodes propres aux Element comme :
          //selectionner un noeud fils, modifier du texte, etc...
          Element courant = (Element)i.next();
          
          listRobotsFinal.add(courant.getAttribute("name").getValue()+"|"+
                  courant.getChild("speed").getText()+"|"+
                  courant.getChild("levelAccess").getText());
       } 
       
       return listRobotsFinal;
    }

    //Affiche le contenu xml du document
    public void print()
    {
        try
        {
            //On utilise ici un affichage classique avec getPrettyFormat()
            XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
            sortie.output(document, System.out);
        }
        catch (java.io.IOException e){}
    }

    public boolean save()
    {
       try
       {
            File MyFile = new File(this.nomFichier); 
            MyFile.delete();
            //On utilise ici un affichage classique avec getPrettyFormat()
            XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
            //Remarquez qu'il suffit simplement de créer une instance de FileOutputStream
            //avec en argument le nom du fichier pour effectuer la sérialisation.
            sortie.output(document, new FileOutputStream(this.nomFichier));
       }
       catch (java.io.IOException e){
           return false;
       }
       return true;
    }

    //affiche tous les éléments d'un document
    public void printALL()
    {
       //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
       List listRobots = racine.getChildren("robot");

       //On crée un Iterator sur notre liste
       Iterator i = listRobots.iterator();
       while(i.hasNext())
       {
          //On recrée l'Element courant à chaque tour de boucle afin de
          //pouvoir utiliser les méthodes propres aux Element comme :
          //selectionner un noeud fils, modifier du texte, etc...
          Element courant = (Element)i.next();
          
          //On print le nom de l'element courant
          System.out.println("\nName: "+courant.getAttribute("name").getValue());
          System.out.println("Speed: "+courant.getChild("speed").getText());
          System.out.println("Access Level: "+courant.getChild("levelAccess").getText());
       } 
    }    
    
    public boolean addRobot(String nameType, String speedType, String levelAccessType)
    {
        try {
            //On crée un nouvel Element etudiant et on l'ajoute
            //en tant qu'Element de racine
            Element robot = new Element("robot");
            racine.addContent(robot);

            //On crée un nouvel Attribut classe et on l'ajoute à etudiant
            //grâce à la méthode setAttribute
            Attribute classe = new Attribute("name",nameType);
            robot.setAttribute(classe);

            //On crée un nouvel Element nom, on lui assigne du texte
            //et on l'ajoute en tant qu'Element de etudiant
            Element speed = new Element("speed");
            speed.setText(speedType);
            robot.addContent(speed);

            //On crée un nouvel Element nom, on lui assigne du texte
            //et on l'ajoute en tant qu'Element de etudiant
            Element levelAccess = new Element("levelAccess");
            levelAccess.setText(levelAccessType);
            robot.addContent(levelAccess);
        } catch (Exception e) {
            return false;
        }
        
        
        return true;
    }
    
    private boolean readFile(){
        //On crée une instance de SAXBuilder
        SAXBuilder sxb = new SAXBuilder();
        try
        {
            //On crée un nouveau document JDOM avec en argument le fichier XML
            //Le parsing est terminé ;)
            document = sxb.build(new File(this.nomFichier));
        }
        catch(Exception e){
            System.out.println("Impossible d'ouvrir le document "+this.nomFichier);
            return false;
        }

        //On initialise un nouvel élément racine avec l'élément racine du document.
        racine = document.getRootElement();
        return true;
    }
    
    public boolean deleteRobot(String name)
    {
        //Dans un premier temps on liste tous les étudiants
        List listRobot = racine.getChildren("robot");
        boolean supprime = false;
        Iterator i = listRobot.iterator();
        //On parcours la liste grâce à un iterator
        while(!supprime && i.hasNext())
        {
            Element courant = (Element)i.next();
            
            //Si le robot en question on supprime
            if(courant.getAttribute("name").getValue().equals(name))
            {
                supprime = true;
                courant.detach();
                     
            }

        }
        return supprime;
        
    }
 
}
